home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Shareware / DeviceLock 6.2.11337 / setup.exe / Main / DLServer.exe / 0 / SQL / 105 < prev    next >
Encoding:
Text (UTF-16)  |  2007-11-12  |  81.3 KB  |  1,721 lines

  1. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLAddDataDesc') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  2.     DROP PROCEDURE DLAddDataDesc
  3. GO
  4. CREATE PROCEDURE DLAddDataDesc
  5.     @ServerId int output,
  6.     @DataSize bigint,
  7.     @DigestSHA1 binary(20),
  8.     @DigestMD5 binary(16),
  9.     @CRC32 binary(4),
  10.     @StoreId int output,
  11.     @Location tinyint output
  12.  
  13. AS
  14.     SET NOCOUNT ON
  15.     DECLARE @ServerIdTmp int
  16.     DECLARE @LocationTmp tinyint
  17.     DECLARE @RealSize bigint
  18.  
  19.     SELECT TOP 1 
  20.         @ServerIdTmp = ServerId,
  21.         @StoreId = StoreId,
  22.         @LocationTmp = Location,
  23.         @RealSize = RealSize
  24.         FROM DLStore
  25.         WHERE DigestSHA1 = @DigestSHA1
  26.         AND DigestMD5 = @DigestMD5
  27.         AND CRC32 = @CRC32
  28.         AND DataSize = @DataSize
  29.  
  30.     IF @@ROWCOUNT > 0 BEGIN
  31.         SET @ServerId = @ServerIdTmp
  32.         SET @Location = @LocationTmp
  33.         IF @RealSize = @DataSize
  34.             RETURN 2
  35.         ELSE
  36.             RETURN 1
  37.     END
  38.     ELSE BEGIN
  39.         INSERT INTO DLStore(ServerId, DataSize, DigestSHA1, DigestMD5, CRC32, Location)
  40.         VALUES(@ServerId, @DataSize, @DigestSHA1, @DigestMD5, @CRC32, @Location)
  41.         SET @StoreId = @@IDENTITY
  42.         RETURN 0
  43.     END
  44.     RETURN 0
  45. GO
  46.  
  47. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLAddStation') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  48.     DROP PROCEDURE DLAddStation
  49. GO
  50. CREATE PROCEDURE DLAddStation
  51.     @ServerId int,
  52.     @NetworkAddr nvarchar(50),
  53.     @Endpoint nvarchar(50),
  54.     @CompId int output
  55. AS
  56.     SET NOCOUNT ON
  57.  
  58.     SELECT TOP 1 @CompId = CompId FROM 
  59.         DLStations
  60.         WHERE ServerId = @ServerId 
  61.         AND NetworkAddr = @NetworkAddr
  62.         
  63.     IF @@ROWCOUNT > 0 BEGIN
  64.         UPDATE DLStations 
  65.             SET Endpoint = @Endpoint, NeedToScan = 1, AttemptsCount = 0
  66.             WHERE ServerId = @ServerId 
  67.             AND CompId = @CompId
  68.         RETURN 1
  69.     END
  70.     ELSE BEGIN
  71.         INSERT INTO DLStations 
  72.         (ServerId, NetworkAddr, Endpoint, NeedToScan, AttemptsCount)
  73.             VALUES (@ServerId, @NetworkAddr, @Endpoint, 1, 0)
  74.         SET @CompId = @@IDENTITY
  75.         RETURN 0
  76.     END
  77. GO
  78.  
  79. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLAddUser') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  80.     DROP PROCEDURE DLAddUser
  81. GO
  82. CREATE PROCEDURE DLAddUser
  83.     @ServerId int,
  84.     @SID nvarchar(255),
  85.     @UserName nvarchar(50) = NULL,
  86.     @ShadowId int = NULL,
  87.     @Flag int = 0,
  88.     @UserId int = NULL output 
  89. AS
  90.     SET NOCOUNT ON
  91.     DECLARE @Ret int
  92.     SELECT TOP 1 @UserId = UserId FROM 
  93.         DLUsers 
  94.         WHERE ServerId = @ServerId 
  95.         AND SID = @SID
  96.         
  97.     IF @@ROWCOUNT > 0 BEGIN
  98.         IF @UserName IS NOT NULL BEGIN
  99.             UPDATE DLUsers 
  100.                 SET UserName = @UserName
  101.                 WHERE ServerId = @ServerId AND 
  102.                 UserId = @UserId
  103.         END
  104.         SET @Ret = 1
  105.     END
  106.     ELSE BEGIN
  107.         IF @UserName IS NULL
  108.             SET @UserName = @SID
  109.             
  110.         INSERT INTO DLUsers (ServerId, SID, UserName)
  111.             VALUES (@ServerId, @SID, @UserName)
  112.         SET @UserId = @@IDENTITY
  113.         SET @Ret = 0
  114.     END
  115.     IF @ShadowId IS NOT NULL AND @UserId IS NOT NULL AND @Flag IS NOT NULL BEGIN
  116.         INSERT INTO DLShadowFiles_Users(ServerId, ShadowId, UserId, Flag)
  117.         SELECT @ServerId, @ShadowId, @UserId, @Flag
  118.         WHERE NOT EXISTS (
  119.             SELECT * 
  120.             FROM DLShadowFiles_Users
  121.             WHERE ServerId = @ServerId 
  122.             AND ShadowId = @ShadowId
  123.             AND UserId = @UserId)
  124.     END
  125.     RETURN @Ret    
  126. GO
  127.  
  128. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLDelData') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  129.     DROP PROCEDURE DLDelData
  130. GO
  131. CREATE PROCEDURE DLDelData
  132.     @ServerId int,
  133.     @ShadowId int
  134. AS
  135.     SET NOCOUNT ON
  136.     
  137.     DECLARE @StoreId int
  138.     DECLARE @ShadowCount int
  139.  
  140.     SELECT @StoreId = StoreId FROM DLShadowFiles
  141.     WHERE ServerId = @ServerId
  142.         AND ShadowId = @ShadowId
  143.     IF @@ROWCOUNT = 0
  144.         RETURN 0
  145.     
  146.     SELECT @ShadowCount = COUNT(ShadowId) FROM DLShadowFiles
  147.     WHERE ServerId = @ServerId
  148.         AND StoreId = @StoreId
  149.     
  150.     IF @ShadowCount > 1 BEGIN 
  151.         UPDATE DLShadowFiles
  152.         SET StoreId = NULL
  153.         WHERE ServerId = @ServerId
  154.             AND ShadowId = @ShadowId    
  155.         RETURN 0
  156.     END
  157.  
  158.     DELETE FROM DLStoreBin
  159.     WHERE ServerId = @ServerId
  160.         AND StoreId = @StoreId        
  161.     
  162.     SET NOCOUNT OFF
  163.     SELECT Url FROM DLStoreUrl
  164.     WHERE ServerId = @ServerId
  165.         AND StoreId = @StoreId
  166.     SET NOCOUNT ON    
  167.  
  168.     DELETE FROM DLStoreUrl
  169.     WHERE ServerId = @ServerId
  170.         AND StoreId = @StoreId
  171.  
  172.     UPDATE DLShadowFiles
  173.     SET StoreId = NULL
  174.     WHERE ServerId = @ServerId
  175.         AND ShadowId = @ShadowId
  176.  
  177.     DELETE FROM DLStore
  178.     WHERE ServerId = @ServerId 
  179.         AND StoreId = @StoreId
  180.     
  181. GO
  182.  
  183. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLDelUser') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  184.     DROP PROCEDURE DLDelUser
  185. GO
  186. CREATE PROCEDURE DLDelUser
  187.     @ServerId int,
  188.     @UserId int
  189. AS
  190.     SET NOCOUNT ON
  191.     
  192.     DELETE FROM DLUsers 
  193.     WHERE ServerId = @ServerId
  194.         AND UserId = @UserId 
  195.         AND NOT EXISTS (
  196.             SELECT * FROM DLShadowFiles_Users
  197.             WHERE ServerId = @ServerId
  198.                 AND UserId = @UserId)
  199.         AND NOT EXISTS (
  200.             SELECT * FROM DLShadowFiles
  201.             WHERE ServerId = @ServerId
  202.                 AND DelUserId = @UserId)
  203.         AND NOT EXISTS (
  204.             SELECT * FROM DLAuditLog
  205.             WHERE ServerId = @ServerId
  206.                 AND UserId = @UserId)
  207.             
  208.     RETURN 0
  209. GO
  210.  
  211. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLGetDataPart') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  212.     DROP PROCEDURE DLGetDataPart
  213. GO
  214. CREATE PROCEDURE DLGetDataPart
  215.     @ServerId int,
  216.     @ShadowId int,
  217.     @PosFrom bigint,
  218.     @SizeToGet bigint
  219. AS
  220.     SET NOCOUNT ON
  221.  
  222.     IF @PosFrom < 0 OR @SizeToGet <= 0
  223.         RETURN 1
  224.     DECLARE @StoreId int
  225.     
  226.     SELECT @StoreId = StoreId 
  227.     FROM DLShadowFiles
  228.     WHERE ServerId = @ServerId AND ShadowId = @ShadowId
  229.         
  230.     IF @@ROWCOUNT = 0
  231.         RETURN 1
  232.         
  233.     DECLARE @CurDataLen int
  234.     DECLARE @CurPartId int
  235.     DECLARE @CurPos bigint
  236.     DECLARE @LocalPos int
  237.     DECLARE @LocalSize int
  238.     DECLARE @SizeCollected bigint
  239.     
  240.     DECLARE @FetchSize int
  241.  
  242.     DECLARE DataCur CURSOR FAST_FORWARD FOR 
  243.         SELECT PartId, DATALENGTH(Data)
  244.         FROM DLStoreBin
  245.         WHERE ServerId = @ServerId
  246.         AND StoreId = @StoreId
  247.         AND Data IS NOT NULL
  248.         ORDER BY PartId ASC
  249.     OPEN DataCur
  250.     SELECT @CurPos = 0, @SizeCollected = 0, @CurPartId = 0, @CurDataLen = 0, @SizeCollected = 0
  251.     
  252.     SET TEXTSIZE 8000
  253.     WHILE 1=1 BEGIN
  254.  
  255.         SET @CurPos = @CurPos + @CurDataLen
  256.  
  257.         FETCH FROM DataCur INTO @CurPartId, @CurDataLen
  258.         
  259.         IF @@fetch_status=-1
  260.             BREAK
  261.         IF @@fetch_status=-2
  262.             CONTINUE
  263.  
  264.         IF @CurPos >= @PosFrom + @SizeToGet
  265.             BREAK
  266.         IF @CurPos + @CurDataLen <= @PosFrom
  267.             CONTINUE
  268.             
  269.         IF @CurPos < @PosFrom
  270.             SET @LocalPos = @PosFrom - @CurPos
  271.         ELSE
  272.             SET @LocalPos = 0
  273.             
  274.         IF @SizeToGet - @SizeCollected < @CurDataLen - @LocalPos
  275.             SET @LocalSize = @SizeToGet - @SizeCollected
  276.         ELSE 
  277.             SET @LocalSize = @CurDataLen - @LocalPos
  278.  
  279.         WHILE @LocalSize > 0 BEGIN
  280.             IF @LocalSize > 8000
  281.                 SET @FetchSize = 8000
  282.             ELSE
  283.                 SET @FetchSize = @LocalSize
  284.             SELECT SUBSTRING(Data, @LocalPos + 1, @FetchSize)
  285.             FROM DLStoreBin
  286.             WHERE ServerId = @ServerId
  287.                 AND StoreId = @StoreId
  288.                 AND PartId = @CurPartId
  289.                 
  290.             SET @LocalPos = @LocalPos + @FetchSize
  291.             SET @LocalSize = @LocalSize - @FetchSize
  292.             SET @SizeCollected = @SizeCollected - @FetchSize
  293.         END
  294.     END
  295.     SET TEXTSIZE 0    
  296.     
  297.     CLOSE DataCur
  298.     DEALLOCATE DataCur
  299.  
  300.     RETURN 0;
  301. GO
  302.  
  303. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLGetDataRealSize') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  304.     DROP PROCEDURE DLGetDataRealSize
  305. GO
  306. CREATE PROCEDURE DLGetDataRealSize
  307.     @ServerId int,
  308.     @StoreId int,
  309.     @DataSize bigint output
  310. AS
  311.     SET NOCOUNT ON
  312.     
  313.     IF EXISTS (SELECT TOP 1 StoreId FROM DLStoreBin
  314.         WHERE ServerId = @ServerId AND StoreId = @StoreId)
  315.     BEGIN
  316.         SELECT @DataSize = SUM(CAST(DATALENGTH(Data) AS bigint)) 
  317.         FROM DLStoreBin
  318.         WHERE ServerId = @ServerId AND StoreId = @StoreId
  319.         RETURN 0;
  320.     END ELSE
  321.         RETURN 1;
  322. GO
  323.  
  324. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLGetDataUrl') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  325.     DROP PROCEDURE DLGetDataUrl
  326. GO
  327. CREATE PROCEDURE DLGetDataUrl
  328.     @ServerId int,
  329.     @ShadowId int
  330. AS
  331.     SET NOCOUNT ON
  332.     DECLARE @StoreId int
  333.     
  334.     SELECT @StoreId = StoreId 
  335.     FROM DLShadowFiles
  336.     WHERE ServerId = @ServerId AND ShadowId = @ShadowId
  337.     
  338.     IF @@ROWCOUNT = 0
  339.         RETURN 1
  340.         
  341.     SET NOCOUNT OFF
  342.     
  343.     SELECT Url FROM DLStoreUrl 
  344.         WHERE ServerId = @ServerId AND StoreId = @StoreId
  345.     
  346.     SET NOCOUNT ON
  347.     
  348.     RETURN 0
  349. GO
  350.  
  351. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLGetFieldById') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  352.     DROP PROCEDURE DLGetFieldById
  353. GO
  354. CREATE PROCEDURE DLGetFieldById
  355.     @QueryId int,
  356.     @FieldId int,
  357.     @FieldFullName nvarchar(200) output 
  358. AS
  359.     SET NOCOUNT ON
  360.     DECLARE @Ret int
  361.     SET @Ret = 0
  362.     SET @FieldFullName = 
  363.     CASE @QueryId
  364.         WHEN 0 THEN CASE @FieldId
  365.             WHEN 0 THEN N'sf.Status'
  366.             WHEN 1 THEN N'st.NetworkAddr'
  367.             WHEN 2 THEN N'us.UserName'
  368.             WHEN 3 THEN N'sf.OriginalFileName'
  369.             WHEN 4 THEN N'sf.ShadowSize'
  370.             WHEN 5 THEN N'sf.StartingOffset'
  371.             WHEN 6 THEN N'sf.CreationDate'
  372.             WHEN 7 THEN N'sf.ProcessName'
  373.             WHEN 8 THEN N'sf.Pid'
  374.             WHEN 9 THEN N'sf.DeviceType'
  375.             WHEN 10 THEN N'sf.OperationType'
  376.             ELSE NULL
  377.         END
  378.         WHEN 1 THEN CASE @FieldId
  379.             WHEN 0 THEN N'ev.Severity'
  380.             WHEN 1 THEN N'ev.LogTime'
  381.             WHEN 2 THEN N'ev.EventCode'
  382.             WHEN 3 THEN N'ev.Message'
  383.             WHEN 4 THEN N'sv.Url'
  384.             WHEN 5 THEN N'ev.EventId'
  385.             ELSE NULL
  386.         END
  387.         WHEN 2 THEN CASE @FieldId
  388.             WHEN 0 THEN N'au.Type'
  389.             WHEN 1 THEN N'st.NetworkAddr'
  390.             WHEN 2 THEN N'au.CreationDate'
  391.             WHEN 3 THEN N'au.DeviceType'
  392.             WHEN 4 THEN N'au.Action'
  393.             WHEN 5 THEN N'au.Name'
  394.             WHEN 6 THEN N'au.Info'
  395.             WHEN 7 THEN N'us.UserName'
  396.             WHEN 8 THEN N'au.Pid'
  397.             WHEN 9 THEN N'au.ProcessName'
  398.             WHEN 10 THEN N'au.EventId'
  399.             ELSE NULL
  400.         END    
  401.         ELSE NULL
  402.     END    
  403.  
  404.     IF @FieldFullName IS NULL BEGIN
  405.         SET @Ret = CASE @QueryId
  406.             WHEN 0 THEN 10
  407.             WHEN 1 THEN 5
  408.             WHEN 2 THEN 10
  409.             ELSE -1
  410.         END
  411.     END    ELSE
  412.         RETURN 0
  413.         
  414.     RETURN @Ret
  415. GO
  416.  
  417. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLGetQueuedStations') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  418.     DROP PROCEDURE DLGetQueuedStations
  419. GO
  420. CREATE PROCEDURE DLGetQueuedStations
  421.     @ServerId int
  422. AS
  423.     SELECT CompId 
  424.     FROM DLStations
  425.     WHERE ServerId = @ServerId
  426.     AND NeedToScan = 1
  427.     
  428.     RETURN 0
  429. GO
  430.  
  431. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLGetServerLocalId') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  432.     DROP PROCEDURE DLGetServerLocalId
  433. GO
  434. CREATE PROCEDURE DLGetServerLocalId
  435.     @ServerGuid uniqueidentifier,
  436.     @ServerUrl    nvarchar(500) = NULL,
  437.     @ServerId int output
  438. AS
  439.     SET NOCOUNT ON
  440.     
  441.     SELECT @ServerId = ServerId 
  442.     FROM DLServers
  443.     WHERE ServerGuid = @ServerGuid
  444.     
  445.     IF @@ROWCOUNT > 0 BEGIN
  446.         IF @ServerUrl IS NOT NULL
  447.             UPDATE DLServers
  448.             SET Url = @ServerUrl 
  449.             WHERE ServerId = @ServerId
  450.     END 
  451.     ELSE BEGIN
  452.         INSERT INTO DLServers(ServerGuid, Url)
  453.         VALUES (@ServerGuid, @ServerUrl)
  454.         SET @ServerId = @@IDENTITY
  455.     END
  456.     RETURN 0
  457. GO
  458.  
  459. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLGetStationAddr') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  460.     DROP PROCEDURE DLGetStationAddr
  461. GO
  462. CREATE PROCEDURE DLGetStationAddr
  463.     @ServerId int,
  464.     @CompId int,
  465.     @NetworkAddr nvarchar(50) output,
  466.     @Endpoint nvarchar(50) output
  467. AS
  468.     SET NOCOUNT ON
  469.     SELECT @NetworkAddr = NetworkAddr, @Endpoint = Endpoint FROM 
  470.         DLStations 
  471.         WHERE ServerId = @ServerId 
  472.         AND CompId = @CompId
  473.     IF @@ROWCOUNT > 0
  474.         RETURN 0
  475.     ELSE
  476.         RETURN 1
  477. GO
  478.  
  479. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLSetDataRealSize') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  480.     DROP PROCEDURE DLSetDataRealSize
  481. GO
  482. CREATE PROCEDURE DLSetDataRealSize
  483.     @ServerId int,
  484.     @StoreId int,
  485.     @RealSize bigint
  486. AS
  487.     SET NOCOUNT ON
  488.     UPDATE DLStore
  489.         SET RealSize = @RealSize
  490.         WHERE ServerId = @ServerId
  491.         AND StoreId = @StoreId
  492.     IF @@ERROR <> 0
  493.         RETURN 1
  494.     ELSE
  495.         RETURN 0
  496. GO
  497.  
  498. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLSetDataUrl') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  499.     DROP PROCEDURE DLSetDataUrl
  500. GO
  501. CREATE PROCEDURE DLSetDataUrl
  502.     @ServerId int,
  503.     @StoreId int,
  504.     @Url ntext
  505. AS
  506.     IF EXISTS (
  507.         SELECT * FROM DLStoreUrl
  508.         WHERE ServerId = @ServerId
  509.         AND StoreId = @StoreId) BEGIN
  510.         UPDATE DLStoreUrl
  511.             SET Url = @Url
  512.             WHERE ServerId = @ServerId 
  513.             AND StoreId = @StoreId
  514.         RETURN 1
  515.     END
  516.     ELSE BEGIN
  517.         INSERT INTO DLStoreUrl(ServerId, StoreId, Url)
  518.             VALUES(@ServerId, @StoreId, @Url)
  519.         RETURN 0
  520.     END
  521. GO
  522.  
  523. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLStationScaned') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  524.     DROP PROCEDURE DLStationScaned
  525. GO
  526. CREATE PROCEDURE DLStationScaned
  527.     @ServerId int,
  528.     @CompId int,
  529.     @MaxAttempts int,
  530.     @Retry int = 0 output
  531. AS
  532.     SET NOCOUNT ON
  533.     IF @Retry > 0 BEGIN
  534.         DECLARE @Attempts int
  535.  
  536.         SELECT @Attempts = AttemptsCount 
  537.         FROM DLStations
  538.         WHERE ServerId = @ServerId
  539.             AND CompId = @CompId
  540.             
  541.         IF @@ROWCOUNT = 0
  542.             RETURN 1
  543.             
  544.         IF @MaxAttempts = 0 OR @Attempts < @MaxAttempts    BEGIN
  545.             SET @Attempts = @Attempts + 1
  546.             SET @Retry = @MaxAttempts - @Attempts
  547.             
  548.             UPDATE DLStations 
  549.                 SET AttemptsCount = @Attempts
  550.                 WHERE ServerId = @ServerId
  551.                 AND CompId = @CompId
  552.         END
  553.         IF @MaxAttempts <> 0 AND @Attempts >= @MaxAttempts BEGIN
  554.             SET @Retry = 0    
  555.             UPDATE DLStations 
  556.                 SET NeedToScan = 0
  557.                 WHERE ServerId = @ServerId
  558.                 AND CompId = @CompId                    
  559.         END
  560.     END
  561.     ELSE BEGIN
  562.         UPDATE DLStations 
  563.             SET NeedToScan = 0,
  564.                 LastScanTime = GETUTCDATE()
  565.             WHERE ServerId = @ServerId 
  566.             AND CompId = @CompId
  567.         IF @@ROWCOUNT = 0
  568.             RETURN 1
  569.     END
  570.     RETURN 0
  571. GO
  572.  
  573. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLFilterGen') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  574.     DROP PROCEDURE DLFilterGen
  575. GO
  576. CREATE PROCEDURE DLFilterGen
  577.     @QueryId int,
  578.     @Condition nvarchar(4000) output
  579. AS
  580.     SET NOCOUNT ON
  581.     DECLARE @Ret int
  582.     DECLARE @FieldId int
  583.     DECLARE @FieldName nvarchar(200)
  584.  
  585.     SET @Condition = LTRIM(@Condition)
  586.     SET @Condition = RTRIM(@Condition)
  587.  
  588.     IF @Condition IS NULL OR @Condition = N''
  589.         SET @Condition = N''
  590.     ELSE BEGIN
  591.         EXEC @FieldId = DLGetFieldById @QueryId, -1, @FieldName output
  592.  
  593.         WHILE @FieldId >= 0 BEGIN
  594.             EXEC @Ret = DLGetFieldById @QueryId, @FieldId, @FieldName output
  595.             IF @Ret <> 0 OR @FieldName IS NULL 
  596.                 BREAK
  597.             SET @Condition = REPLACE(@Condition, CAST(@FieldId AS nvarchar(2))+N'?', @FieldName)
  598.             SET @FieldId = @FieldId - 1        
  599.         END
  600.         SET @Condition = REPLACE(@Condition, N'\?', N'?')
  601.         SET @Condition = REPLACE(@Condition, N'\\', N'\')
  602.     END
  603.  
  604.     RETURN 0        
  605. GO
  606.  
  607. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLGetOption') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  608.     DROP PROCEDURE DLGetOption
  609. GO
  610. CREATE PROCEDURE DLGetOption
  611.     @Name nvarchar(50),
  612.     @Value nvarchar(50) output,
  613.     @ServerId int = NULL,
  614.     @CompId int = NULL
  615. AS
  616.     SET NOCOUNT ON
  617.  
  618.     SELECT TOP 1 @Value = Value 
  619.     FROM DLSettings 
  620.     WHERE [Name] = @Name
  621.     AND ISNULL(ServerId, -1) = ISNULL(@ServerId, -1)
  622.     AND ISNULL(CompId, -1) = ISNULL(@CompId, -1)
  623.     
  624.     IF @@ROWCOUNT > 0
  625.         RETURN 0
  626.  
  627.     RETURN 1
  628. GO
  629.  
  630. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLSetOption') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  631.     DROP PROCEDURE DLSetOption
  632. GO
  633. CREATE PROCEDURE DLSetOption
  634.     @Name nvarchar(50),
  635.     @Value nvarchar(50),
  636.     @ServerId int = NULL,
  637.     @CompId int = NULL
  638. AS
  639.     SET NOCOUNT ON
  640.     
  641.     DECLARE @TmpValue nvarchar(50)
  642.     DECLARE @Ret int
  643.     
  644.     EXEC @Ret = DLGetOption @Name, @TmpValue output, @ServerId, @CompId
  645.     
  646.     IF @Ret = 0 BEGIN
  647.         IF @Value = @TmpValue
  648.             RETURN 0
  649.             
  650.         IF @Value IS NULL BEGIN
  651.             DELETE FROM DLSettings
  652.             WHERE [Name] = @Name
  653.             AND ISNULL(ServerId, -1) = ISNULL(@ServerId, -1)
  654.             AND ISNULL(CompId, -1) = ISNULL(@CompId, -1)
  655.             RETURN 2
  656.         END
  657.         
  658.         UPDATE DLSettings
  659.         SET Value = @Value
  660.         WHERE [Name] = @Name
  661.         AND ISNULL(ServerId, -1) = ISNULL(@ServerId, -1)
  662.         AND ISNULL(CompId, -1) = ISNULL(@CompId, -1)
  663.         
  664.         RETURN 0
  665.     END 
  666.     ELSE BEGIN
  667.         INSERT INTO DLSettings([Name], Value, ServerId, CompId)
  668.         VALUES(@Name, @Value, @ServerId, @CompId)
  669.         
  670.         RETURN 1
  671.     END
  672.  
  673.     RETURN 1
  674. GO
  675.  
  676. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLAddAuditRecord') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  677.     DROP PROCEDURE DLAddAuditRecord
  678. GO
  679.  
  680. CREATE PROCEDURE DLAddAuditRecord
  681.     @ServerId int,
  682.     @CompId int,
  683.     @SID nvarchar(255),
  684.     @UserName nvarchar(50),
  685.     @CreationDate bigint,
  686.     @EventId int,
  687.     @Type smallint,
  688.     @ProcessName nvarchar (1500),
  689.     @Pid int,
  690.     @DeviceType nvarchar (500),
  691.     @Action nvarchar (500),
  692.     @Name nvarchar (500),
  693.     @Info nvarchar (500),
  694.     @CustomData ntext,
  695.     @RecordId int = NULL output 
  696. AS
  697.     SET NOCOUNT ON
  698.     
  699.     DECLARE @UserId int
  700.  
  701.     SET @UserId = NULL
  702.     
  703.     IF @SID IS NOT NULL
  704.         EXEC DLAddUser @ServerId, @SID, @UserName, NULL, NULL, @UserId output
  705.     
  706.     INSERT INTO DLAuditLog (ServerId, CompId, UserId, CreationDate, EventId, 
  707.                             Type, ProcessName, Pid, DeviceType, [Action], 
  708.                             [Name], Info, CustomData)
  709.     VALUES (@ServerId, @CompId, @UserId, @CreationDate, @EventId, 
  710.             @Type, @ProcessName, @Pid, @DeviceType, @Action, 
  711.             @Name, @Info, @CustomData)
  712.             
  713.     SET @RecordId = @@IDENTITY
  714.     
  715.     RETURN 0
  716. GO
  717.  
  718. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLClearAuditLog') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  719.     DROP PROCEDURE DLClearAuditLog
  720. GO
  721.  
  722. CREATE PROCEDURE DLClearAuditLog
  723.     @NRecords int output
  724. AS
  725.     SET NOCOUNT ON
  726.     DECLARE @ident int
  727.     
  728.     BEGIN TRAN
  729.     
  730.     SELECT @NRecords = COUNT(*) 
  731.     FROM DLAuditLog
  732.     
  733.     SET @ident = IDENT_CURRENT('DLAuditLog')
  734.     TRUNCATE TABLE DLAuditLog
  735.     DBCC CHECKIDENT ('DLAuditLog', RESEED, @ident)
  736.     
  737.     COMMIT    
  738.         
  739. GO
  740.  
  741. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLFilterAuditLog') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  742.     DROP PROCEDURE DLFilterAuditLog
  743. GO
  744. CREATE PROCEDURE DLFilterAuditLog
  745.     @Condition nvarchar(2000),
  746.     @SortField int = NULL,
  747.     @SortDir bit = 0,
  748.     @PosFrom int = 0,
  749.     @RecCount int = 0
  750.     
  751. AS
  752.     SET NOCOUNT ON
  753.     DECLARE @Ret int
  754.     DECLARE @FieldName nvarchar(200)
  755.     DECLARE @Query nvarchar(4000)
  756.     DECLARE @SortOrder nvarchar(5)
  757.     DECLARE @SortBackOrder nvarchar(5)
  758.     DECLARE @RecordsCount int
  759.     
  760.     SET @Query = @Condition
  761.     EXEC DLFilterGen 2, @Query output
  762.     
  763.     IF @Query <> N'' 
  764.         SET @Query = N'WHERE ' + @Query    
  765.     
  766.     SET @Query = 
  767.     N'FROM DLAuditLog AS au 
  768.     INNER JOIN DLStations AS st
  769.         ON au.ServerId = st.ServerId
  770.         AND au.CompId = st.CompId 
  771.     LEFT OUTER JOIN DLUsers AS us
  772.         ON au.ServerId = us.ServerId
  773.         AND au.UserId = us.UserId ' + @Query
  774.         
  775.     IF @SortField IS NULL BEGIN
  776.         SET @Query = N'SELECT COUNT(DISTINCT au.RecordId) ' + @Query
  777.         GOTO exec_query
  778.     END
  779.         
  780.     EXEC @Ret = DLGetFieldById 2, @SortField, @FieldName output
  781.         
  782.     IF @Ret <> 0 SET @FieldName = N'1'
  783.     
  784.     IF ISNULL(@SortDir, 0) = 0 BEGIN
  785.         SET @SortOrder = 'ASC'
  786.         SET @SortBackOrder = 'DESC'
  787.     END
  788.     ELSE BEGIN
  789.         SET @SortOrder = 'DESC'
  790.         SET @SortBackOrder = 'ASC'
  791.     END
  792.     
  793.     SET @RecordsCount = (SELECT COUNT(*) FROM DLAuditLog)
  794.     
  795.     IF ISNULL(@PosFrom, 0) <= 0
  796.         SET @PosFrom = 1
  797.  
  798.     IF ISNULL(@RecCount, 0) < 0
  799.         RETURN 1
  800.     
  801.     IF @PosFrom > @RecordsCount BEGIN
  802.         SET @RecCount = 0
  803.     END
  804.     ELSE IF @PosFrom + @RecCount > @RecordsCount BEGIN
  805.         SET @RecCount = @RecordsCount - @PosFrom + 1        
  806.     END
  807.  
  808.     SET @Query = 
  809.     N'au.ServerId AS ServerId,
  810.     au.RecordId AS RecordId,
  811.     st.NetworkAddr AS NetworkAddr,
  812.     us.UserName AS UserName,
  813.     us.SID AS SID,
  814.     ' + @FieldName + N' AS SortField ' + @Query
  815.     
  816.     IF @RecCount IS NULL BEGIN
  817.         SET @Query = N'SELECT DISTINCT ' + @Query
  818.  
  819.         SET @Query = N'SELECT S1.ServerId AS ServerId,
  820.                     S1.RecordId AS RecordId,
  821.                     au.EventId AS EventId,
  822.                     au.Type AS Type,
  823.                     au.CreationDate AS CreationDate,
  824.                     au.Pid AS Pid,                    
  825.                     S1.NetworkAddr AS NetworkAddr,
  826.                     au.DeviceType AS DeviceType,
  827.                     au.Action AS Action,
  828.                     au.Name AS Name,
  829.                     au.Info AS Info,                    
  830.                     S1.UserName AS UserName,
  831.                     S1.SID AS SID,
  832.                     au.ProcessName AS ProcessName,
  833.                     au.CustomData AS CustomData
  834.                     FROM (' + @Query + N') AS S1,
  835.                     DLAuditLog as au
  836.                     WHERE S1.ServerId = au.ServerId 
  837.                     AND S1.RecordId = au.RecordId
  838.                     ORDER BY S1.SortField ' + @SortOrder + 
  839.                     N', S1.RecordId ' + @SortOrder
  840.     END
  841.     ELSE BEGIN
  842.         SET @Query = N'SELECT DISTINCT TOP ' + CAST(@PosFrom+@RecCount-1 AS nvarchar(10)) + N' ' +
  843.                     @Query + 
  844.                     N' ORDER BY ' + @FieldName + N' ' + @SortOrder +
  845.                     N', au.RecordId ' + @SortOrder
  846.             
  847.  
  848.         SET @Query = N'SELECT TOP '+ CAST(@RecCount AS nvarchar(10)) + N' * 
  849.                     FROM (' + @Query + N') AS S1 
  850.                     ORDER BY SortField ' + @SortBackOrder +
  851.                     N', RecordId ' + @SortBackOrder
  852.  
  853.  
  854.         SET @Query = N'SELECT S2.ServerId AS ServerId,
  855.                     S2.RecordId AS RecordId,
  856.                     au.EventId AS EventId,
  857.                     au.Type AS Type,
  858.                     au.CreationDate AS CreationDate,
  859.                     au.Pid AS Pid,                    
  860.                     S2.NetworkAddr AS NetworkAddr,
  861.                     au.DeviceType AS DeviceType,
  862.                     au.Action AS Action,
  863.                     au.Name AS Name,
  864.                     au.Info AS Info,                    
  865.                     S2.UserName AS UserName,
  866.                     S2.SID AS SID,
  867.                     au.ProcessName AS ProcessName,
  868.                     au.CustomData AS CustomData
  869.                     FROM (' + @Query + N') AS S2,
  870.                     DLAuditLog as au
  871.                     WHERE S2.ServerId = au.ServerId 
  872.                     AND S2.RecordId = au.RecordId
  873.                     ORDER BY S2.SortField' + N' '+ @SortOrder +
  874.                     N', S2.RecordId ' + @SortOrder
  875.     END
  876.  
  877. exec_query:
  878.     SET NOCOUNT OFF
  879.     EXEC(@Query)
  880.     SET NOCOUNT ON
  881.     IF @@ERROR <> 0
  882.         RETURN 1
  883.     RETURN 0        
  884. GO
  885. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLPreAddAuditLog') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  886.     DROP PROCEDURE DLPreAddAuditLog
  887. GO
  888.  
  889. CREATE PROCEDURE DLPreAddAuditLog
  890.     @Size int,
  891.     @NeedDelete int,
  892.     @TimeBefore bigint = NULL    
  893. AS
  894.     SET NOCOUNT ON
  895.     DECLARE @RecordsCount int
  896.     DECLARE @DeleteCount int
  897.     DECLARE @ServerId int
  898.     DECLARE @RecordId int
  899.     DECLARE @Ret int
  900.     
  901.     SET @Ret = 0
  902.     
  903.     SELECT @RecordsCount = COUNT(*) FROM DLAuditLog
  904.     
  905.     IF @RecordsCount <= @Size
  906.         RETURN 1
  907.     
  908.     IF @NeedDelete = 0 
  909.         RETURN @Ret
  910.     
  911.     SET @DeleteCount = @RecordsCount - @Size
  912.     
  913.     
  914.     IF @TimeBefore IS NULL BEGIN
  915.         DECLARE OverwriteCur CURSOR FOR
  916.             SELECT ServerId, RecordId FROM DLAuditLog 
  917.             ORDER BY CreationDate ASC, RecordId ASC
  918.     END
  919.     ELSE BEGIN
  920.         DECLARE OverwriteCur CURSOR FOR
  921.             SELECT ServerId, RecordId FROM DLAuditLog 
  922.             WHERE CreationDate < @TimeBefore
  923.             ORDER BY CreationDate ASC, RecordId ASC        
  924.     END
  925.     
  926.     OPEN OverwriteCur
  927.     
  928.     WHILE @DeleteCount > 0 BEGIN
  929.          FETCH NEXT FROM OverwriteCur INTO @ServerId, @RecordId
  930.         IF @@fetch_status = -1 
  931.             BREAK
  932.         SET @DeleteCount = @DeleteCount - 1
  933.         
  934.         IF @@fetch_status = -2
  935.             CONTINUE
  936.  
  937.         DELETE DLAuditLog WHERE ServerId = @ServerId AND RecordId = @RecordId
  938.         
  939.         IF @@ROWCOUNT > 0
  940.             SET @Ret = @Ret | 2
  941.             
  942.     END    
  943.     
  944.     CLOSE OverwriteCur
  945.     DEALLOCATE OverwriteCur
  946.     
  947.     IF @DeleteCount <= 0
  948.         SET @Ret = @Ret | 1
  949.     
  950.     RETURN @Ret    
  951. GO
  952.  
  953. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLLastAuditRecordTime') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  954.     DROP PROCEDURE DLLastAuditRecordTime
  955. GO
  956.  
  957. CREATE PROCEDURE DLLastAuditRecordTime
  958.     @CompId int,
  959.     @Timestamp bigint output
  960. AS
  961.     SET NOCOUNT ON
  962.     
  963.     SELECT @Timestamp = MAX(CreationDate)
  964.     FROM DLAuditLog 
  965.     WHERE CompId = @CompId
  966.     
  967.     SET @Timestamp = ISNULL(@Timestamp, 0)
  968.  
  969.     RETURN 0
  970. GO
  971.  
  972. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLClearServerLog') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  973.     DROP PROCEDURE DLClearServerLog
  974. GO
  975. CREATE PROCEDURE DLClearServerLog
  976.     @NRecords int output
  977. AS
  978.     SET NOCOUNT ON
  979.     DECLARE @ident int
  980.     
  981.     BEGIN TRAN
  982.     
  983.     SELECT @NRecords = COUNT(*) 
  984.     FROM DLEvents
  985.     
  986.     SET @ident = IDENT_CURRENT('DLEvents')
  987.     TRUNCATE TABLE DLEvents
  988.     DBCC CHECKIDENT ('DLEvents', RESEED, @ident)
  989.     
  990.     COMMIT    
  991. GO
  992. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLFilterServerLog') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  993.     DROP PROCEDURE DLFilterServerLog
  994. GO
  995. CREATE PROCEDURE DLFilterServerLog
  996.     @Condition nvarchar(2000),
  997.     @SortField int = NULL,
  998.     @SortDir bit = 0,
  999.     @PosFrom int = 0,
  1000.     @RecCount int = 0
  1001.     
  1002. AS
  1003.     SET NOCOUNT ON
  1004.     DECLARE @Ret int
  1005.     DECLARE @FieldName nvarchar(200)
  1006.     DECLARE @Query nvarchar(4000)
  1007.     DECLARE @SortOrder nvarchar(5)
  1008.     DECLARE @SortBackOrder nvarchar(5)
  1009.     DECLARE @RecordsCount int
  1010.     DECLARE @IndexField int
  1011.     
  1012.     SET @IndexField = 5
  1013.     
  1014.     
  1015.     SET @Query = @Condition
  1016.     
  1017.     EXEC DLFilterGen 1, @Query output
  1018.     
  1019.     IF @Query <> N'' 
  1020.         SET @Query = N'WHERE ' + @Query    
  1021.         
  1022.     SET @Query = 
  1023.     N'FROM DLEvents AS ev 
  1024.     INNER JOIN DLServers AS sv
  1025.         ON sv.ServerId = ev.ServerId ' + @Query
  1026.         
  1027.     IF @SortField IS NULL BEGIN
  1028.         SET @Query = N'SELECT COUNT(DISTINCT ev.EventId) ' + @Query
  1029.         GOTO exec_query
  1030.     END
  1031.             
  1032.     IF @SortField <> @IndexField
  1033.         EXEC @Ret = DLGetFieldById 1, @SortField, @FieldName output
  1034.     ELSE 
  1035.         SET @Ret = 1
  1036.         
  1037.     IF @Ret <> 0 SET @FieldName = N'1'
  1038.     
  1039.     IF ISNULL(@SortDir, 0) = 0 BEGIN
  1040.         SET @SortOrder = 'ASC'
  1041.         SET @SortBackOrder = 'DESC'
  1042.     END
  1043.     ELSE BEGIN
  1044.         SET @SortOrder = 'DESC'
  1045.         SET @SortBackOrder = 'ASC'
  1046.     END
  1047.     
  1048.     SET @RecordsCount = (SELECT COUNT(*) FROM DLEvents)
  1049.     
  1050.     IF ISNULL(@PosFrom, 0) <= 0
  1051.         SET @PosFrom = 1
  1052.  
  1053.     IF ISNULL(@RecCount, 0) < 0
  1054.         RETURN 1
  1055.     
  1056.     IF @PosFrom > @RecordsCount BEGIN
  1057.         SET @RecCount = 0
  1058.     END
  1059.     ELSE IF @PosFrom + @RecCount > @RecordsCount BEGIN
  1060.         SET @RecCount = @RecordsCount - @PosFrom + 1        
  1061.     END
  1062.  
  1063.     SET @Query = 
  1064.     N'ev.EventId AS EventId,
  1065.     ev.Severity AS Severity,
  1066.     ev.EventCode AS EventCode,
  1067.     ev.LogTime AS LogTime,
  1068.     sv.Url AS Server,
  1069.     ev.Message AS Message, 
  1070.     ' + @FieldName + N' AS SortField ' + @Query
  1071.     
  1072.     IF @RecCount IS NULL BEGIN
  1073.         SET @Query = N'SELECT DISTINCT ' + @Query
  1074.  
  1075.         SET @Query = N'SELECT S1.EventId AS EventId,
  1076.                     S1.Severity AS Severity,
  1077.                     S1.EventCode AS EventCode,
  1078.                     S1.LogTime AS LogTime,
  1079.                     S1.Server AS Server,
  1080.                     S1.Message AS Message
  1081.                     FROM (' + @Query + N') AS S1
  1082.                     ORDER BY S1.SortField ' + @SortOrder +
  1083.                     N', S1.EventId ' + @SortOrder
  1084.     END
  1085.     ELSE BEGIN
  1086.         SET @Query = N'SELECT DISTINCT TOP ' + CAST(@PosFrom+@RecCount-1 AS nvarchar(10)) + N' ' +
  1087.                     @Query + 
  1088.                     N' ORDER BY SortField ' + @SortOrder +
  1089.                     N', ev.EventId ' + @SortOrder
  1090.  
  1091.         SET @Query = N'SELECT TOP '+ CAST(@RecCount AS nvarchar(10)) + N' * 
  1092.                     FROM (' + @Query + N') AS S1 
  1093.                     ORDER BY SortField ' + @SortBackOrder +
  1094.                     N', EventId ' + @SortBackOrder
  1095.  
  1096.         SET @Query = N'SELECT S2.EventId AS EventId,
  1097.                     S2.Severity AS Severity,
  1098.                     S2.EventCode AS EventCode,
  1099.                     S2.LogTime AS LogTime,
  1100.                     S2.Server AS Server,
  1101.                     S2.Message AS Message
  1102.                     FROM (' + @Query + N') AS S2
  1103.                     ORDER BY S2.SortField' + N' '+ @SortOrder +
  1104.                     N', S2.EventId ' + @SortOrder
  1105.     END
  1106.     
  1107. exec_query:
  1108.     SET NOCOUNT OFF
  1109.     EXEC(@Query)
  1110.     print @Query
  1111.     SET NOCOUNT ON
  1112.     IF @@ERROR <> 0
  1113.         RETURN 1
  1114.     RETURN 0        
  1115. GO
  1116. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLLogEvent') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  1117.     DROP PROCEDURE DLLogEvent
  1118. GO
  1119. CREATE PROCEDURE DLLogEvent
  1120.     @ServerId int,
  1121.     @Severity int,
  1122.     @EventCode int,
  1123.     @Message nvarchar(1000)
  1124. AS
  1125.     SET NOCOUNT ON
  1126.     
  1127.     INSERT INTO DLEvents(ServerId, LogTime, Severity, EventCode, Message)
  1128.     VALUES(@ServerId, GETUTCDATE(), @Severity, @EventCode, @Message)
  1129.  
  1130. GO
  1131.  
  1132. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLPreAddServerLog') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  1133.     DROP PROCEDURE DLPreAddServerLog
  1134. GO
  1135.  
  1136. CREATE PROCEDURE DLPreAddServerLog
  1137.     @Size int,
  1138.     @NeedDelete int,
  1139.     @DaysBefore int = NULL
  1140. AS
  1141.     SET NOCOUNT ON
  1142.     DECLARE @RecordsCount int
  1143.     DECLARE @DeleteCount int
  1144.     DECLARE @ServerId int
  1145.     DECLARE @EventId int
  1146.     DECLARE @Ret int
  1147.     
  1148.     SET @Ret = 0
  1149.         
  1150.     SELECT @RecordsCount = COUNT(*) FROM DLEvents
  1151.     
  1152.     IF @RecordsCount <= @Size
  1153.         RETURN 1
  1154.     
  1155.     IF @NeedDelete = 0 
  1156.         RETURN @Ret
  1157.     
  1158.     SET @DeleteCount = @RecordsCount - @Size
  1159.     
  1160.     
  1161.     IF @DaysBefore IS NULL BEGIN
  1162.         DECLARE OverwriteCur CURSOR FOR
  1163.             SELECT ServerId, EventId FROM DLEvents 
  1164.             ORDER BY LogTime ASC, EventId ASC
  1165.     END
  1166.     ELSE BEGIN
  1167.         DECLARE OverwriteCur CURSOR FOR
  1168.             SELECT ServerId, EventId FROM DLEvents 
  1169.             WHERE LogTime < DATEADD(dd, -@DaysBefore, GETUTCDATE())
  1170.             ORDER BY LogTime ASC, EventId ASC        
  1171.     END
  1172.     
  1173.     OPEN OverwriteCur
  1174.     
  1175.     WHILE @DeleteCount > 0 BEGIN
  1176.          FETCH NEXT FROM OverwriteCur INTO @ServerId, @EventId
  1177.         IF @@fetch_status=-1 
  1178.             BREAK
  1179.         SET @DeleteCount = @DeleteCount - 1
  1180.                     
  1181.         IF @@fetch_status=-2
  1182.             CONTINUE
  1183.             
  1184.         DELETE DLEvents WHERE ServerId = @ServerId AND EventId = @EventId
  1185.         
  1186.         IF @@ROWCOUNT > 0
  1187.             SET @Ret = @Ret | 2        
  1188.     END    
  1189.     
  1190.     CLOSE OverwriteCur
  1191.     DEALLOCATE OverwriteCur
  1192.     
  1193.     IF @DeleteCount <= 0
  1194.         SET @Ret = @Ret | 1
  1195.     
  1196.     RETURN @Ret    
  1197.     
  1198. GO
  1199.  
  1200. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLAddShadowFile') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  1201.     DROP PROCEDURE DLAddShadowFile
  1202. GO
  1203. CREATE PROCEDURE DLAddShadowFile
  1204.     @ServerId int,
  1205.     @MyServerId int,
  1206.     @CompId int,
  1207.     @OriginalFileName nvarchar(1500),
  1208.     @CreationDate bigint,
  1209.     @DeviceType int,
  1210.     @OperationType int,
  1211.     @ProcessName nvarchar(1500),
  1212.     @Pid int,
  1213.     @StartingOffset bigint,
  1214.     @ShadowSize bigint,
  1215.     @IsFastRebuild bit,
  1216.     @IOErrFile image,
  1217.     @XMLFile ntext,
  1218.     @StoreId int,
  1219.     @Attributes int,
  1220.     @Status int,
  1221.     @ShadowId int output,
  1222.     @DelShadowId int output
  1223. AS
  1224.     SET NOCOUNT ON
  1225.  
  1226.     DECLARE @NetAddr nvarchar(50)
  1227.     DECLARE @Endpoint nvarchar(50)
  1228.     IF @MyServerId <> @ServerId BEGIN
  1229.         EXEC DLGetStationAddr @MyServerId, @CompId, @NetAddr output, @Endpoint output
  1230.         EXEC DLAddStation @ServerId, @NetAddr, @Endpoint, @CompId output
  1231.         EXEC DLStationScaned @ServerId, @CompId, 0, 0
  1232.     END
  1233.     
  1234.     SET @DelShadowId = 0
  1235.     
  1236.     SELECT TOP 1 @ShadowId = ShadowId
  1237.     FROM DLShadowFiles
  1238.     WHERE ServerId = @ServerId
  1239.     AND CompId = @CompId
  1240.     AND CreationDate = @CreationDate
  1241.     AND IsFastRebuild = @IsFastRebuild
  1242.     AND StoreId = @StoreId
  1243.  
  1244.     
  1245.     IF @@ROWCOUNT > 0
  1246.         RETURN 0    
  1247.         
  1248.     INSERT INTO DLShadowFiles
  1249.     (ServerId, CompId, OriginalFileName, CreationDate,
  1250.     DeviceType, OperationType, ProcessName, Pid, StartingOffset, 
  1251.     ShadowSize, IsFastRebuild, IOErrFile, XMLFile, StoreId, 
  1252.     Attributes, Status)
  1253.     VALUES
  1254.     (@ServerId, @CompId, @OriginalFileName, @CreationDate,
  1255.     @DeviceType, @OperationType, @ProcessName, @Pid, @StartingOffset,
  1256.     @ShadowSize, @IsFastRebuild, @IOErrFile, @XMLFile, @StoreId, 
  1257.     @Attributes, @Status)
  1258.  
  1259.     SET @ShadowId = @@IDENTITY
  1260.  
  1261.  
  1262.     IF @IsFastRebuild = 0 BEGIN
  1263.         SELECT TOP 1 @DelShadowId = ShadowId
  1264.         FROM DLShadowFiles
  1265.         WHERE ServerId = @ServerId
  1266.         AND CompId = @CompId
  1267.         AND CreationDate = @CreationDate
  1268.         AND IsFastRebuild = 1
  1269.     
  1270.         IF @@ROWCOUNT > 0 
  1271.             RETURN 1
  1272.     END
  1273.     
  1274.     RETURN 0
  1275. GO
  1276.  
  1277. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLBatchShadowAttr') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  1278.     DROP PROCEDURE DLBatchShadowAttr
  1279. GO
  1280. CREATE PROCEDURE DLBatchShadowAttr
  1281.     @Condition nvarchar(2000),
  1282.     @AttrIncl int,
  1283.     @AttrExcl int,
  1284.     @AttrAdd int,
  1285.     @AttrDel int,
  1286.     @NRecords int output
  1287. AS
  1288.     SET NOCOUNT ON
  1289.     
  1290.     DECLARE @Query nvarchar(4000)
  1291.     DECLARE @AttrStrIncl nvarchar(10)
  1292.     DECLARE @AttrStrExcl nvarchar(10)
  1293.     
  1294.     
  1295.     SET @Query = @Condition
  1296.     
  1297.     EXEC DLFilterGen 0, @Query output
  1298.         
  1299.     SET @AttrStrIncl = CAST(@AttrIncl AS nvarchar(10))
  1300.     SET @AttrStrExcl = CAST(@AttrExcl AS nvarchar(10))    
  1301.  
  1302.     IF @Query <> N'' 
  1303.         SET @Query = N'AND ' + @Query
  1304.                 
  1305.     SET @Query =
  1306.         CASE @AttrIncl
  1307.             WHEN 0 THEN N'sf.Attributes = 0 '
  1308.             ELSE N'sf.Attributes & ' + @AttrStrIncl + N' = ' + @AttrStrIncl + N' '
  1309.         END
  1310.         +
  1311.         CASE @AttrExcl
  1312.             WHEN 0 THEN N''
  1313.             ELSE N'AND sf.Attributes & ' + @AttrStrExcl + N' = 0 '
  1314.         END
  1315.         + @Query
  1316.                 
  1317.     SET @Query = N'UPDATE DLShadowFiles
  1318.         SET Attributes = (Attributes & ~' + CAST(@AttrDel AS nvarchar(10)) + 
  1319.         N') | ' + CAST(@AttrAdd AS nvarchar(10)) + 
  1320.         N' FROM DLShadowFiles AS sf 
  1321.         INNER JOIN DLStations AS st
  1322.             ON sf.ServerId = st.ServerId
  1323.             AND sf.CompId = st.CompId    
  1324.         LEFT OUTER JOIN DLShadowFiles_Users AS sf_u 
  1325.             ON sf.ServerId = sf_u.ServerId
  1326.             AND sf.ShadowId = sf_u.ShadowId
  1327.             AND sf_u.Flag <> 0
  1328.         LEFT OUTER JOIN DLUsers AS us
  1329.             ON sf.ServerId = us.ServerId
  1330.             AND sf_u.UserId = us.UserId
  1331.         WHERE ' + @Query
  1332.     
  1333.     EXEC(@Query)
  1334.  
  1335.     SET @NRecords = @@ROWCOUNT
  1336.  
  1337.     IF @@ERROR <> 0
  1338.         RETURN 1
  1339.     RETURN 0
  1340. GO
  1341.  
  1342. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLDelShadowFile') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  1343.     DROP PROCEDURE DLDelShadowFile
  1344. GO
  1345. CREATE PROCEDURE DLDelShadowFile
  1346.     @ServerId int,
  1347.     @ShadowId int
  1348. AS
  1349.     SET NOCOUNT ON
  1350.     DECLARE @Ret int
  1351.     DECLARE @UserId int
  1352.  
  1353.     EXEC DLDelData @ServerId, @ShadowId
  1354.  
  1355.     DECLARE UserCur CURSOR STATIC LOCAL FOR
  1356.     SELECT UserId FROM DLShadowFiles_Users 
  1357.     WHERE ServerId = @ServerId
  1358.         AND ShadowId = @ShadowId
  1359.         
  1360.     OPEN UserCur
  1361.     DELETE FROM DLShadowFiles_Users
  1362.     WHERE ServerId = @ServerId
  1363.         AND ShadowId = @ShadowId
  1364.  
  1365.     WHILE 1=1 BEGIN
  1366.          FETCH NEXT FROM UserCur INTO @UserId
  1367.         IF @@fetch_status=-1 
  1368.             BREAK
  1369.         IF @@fetch_status=-2
  1370.             CONTINUE
  1371.         EXEC DLDelUser @ServerId, @UserId
  1372.     END
  1373.     CLOSE UserCur
  1374.     DEALLOCATE UserCur
  1375.     
  1376.     DELETE FROM DLShadowFiles
  1377.     WHERE ServerId = @ServerId
  1378.         AND ShadowId = @ShadowId
  1379.         
  1380.     RETURN 0        
  1381. GO
  1382.  
  1383. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLFilterShadow') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  1384.     DROP PROCEDURE DLFilterShadow
  1385. GO
  1386. CREATE PROCEDURE DLFilterShadow
  1387.     @Condition nvarchar(2000),
  1388.     @AttrIncl int,
  1389.     @AttrExcl int,    
  1390.     @SortField int = NULL,
  1391.     @SortDir bit = 0,
  1392.     @PosFrom int = 0,
  1393.     @RecCount int = 0
  1394.     
  1395. AS
  1396.     SET NOCOUNT ON
  1397.     DECLARE @Ret int
  1398.     DECLARE @FieldName nvarchar(200)
  1399.     DECLARE @Query nvarchar(4000)
  1400.     DECLARE @SortOrder nvarchar(5)
  1401.     DECLARE @SortBackOrder nvarchar(5)
  1402.     DECLARE @RecordsCount int
  1403.     DECLARE @AttrStrIncl nvarchar(10)
  1404.     DECLARE @AttrStrExcl nvarchar(10)
  1405.  
  1406.     
  1407.     SET @Query = @Condition
  1408.     
  1409.     EXEC DLFilterGen 0, @Query output
  1410.         
  1411.     SET @AttrStrIncl = CAST(@AttrIncl AS nvarchar(10))
  1412.     SET @AttrStrExcl = CAST(@AttrExcl AS nvarchar(10))    
  1413.  
  1414.     IF @Query <> N'' 
  1415.         SET @Query = N'AND ' + @Query
  1416.                 
  1417.     SET @Query =
  1418.         CASE @AttrIncl
  1419.             WHEN 0 THEN N'sf.Attributes = 0 '
  1420.             ELSE N'sf.Attributes & ' + @AttrStrIncl + N' = ' + @AttrStrIncl + N' '
  1421.         END
  1422.         +
  1423.         CASE @AttrExcl
  1424.             WHEN 0 THEN N''
  1425.             ELSE N'AND sf.Attributes & ' + @AttrStrExcl + N' = 0 '
  1426.         END
  1427.         + @Query
  1428.                 
  1429.     SET @Query = 
  1430.     N'FROM DLShadowFiles AS sf 
  1431.     INNER JOIN DLStations AS st
  1432.         ON sf.ServerId = st.ServerId
  1433.         AND sf.CompId = st.CompId    
  1434.     LEFT OUTER JOIN DLShadowFiles_Users AS sf_u 
  1435.         ON sf.ServerId = sf_u.ServerId
  1436.         AND sf.ShadowId = sf_u.ShadowId
  1437.         AND sf_u.Flag <> 0
  1438.     LEFT OUTER JOIN DLUsers AS us
  1439.         ON sf.ServerId = us.ServerId
  1440.         AND sf_u.UserId = us.UserId
  1441.     WHERE ' + @Query
  1442.     
  1443.     IF @SortField IS NULL BEGIN
  1444.         SET @Query = N'SELECT COUNT(DISTINCT sf.ShadowId) ' + @Query
  1445.         GOTO exec_query
  1446.     END
  1447.     
  1448.     EXEC @Ret = DLGetFieldById 0, @SortField, @FieldName output
  1449.     IF @Ret <> 0 SET @FieldName = N'1'
  1450.     
  1451.     IF ISNULL(@SortDir, 0) = 0 BEGIN
  1452.         SET @SortOrder = 'ASC'
  1453.         SET @SortBackOrder = 'DESC'
  1454.     END
  1455.     ELSE BEGIN
  1456.         SET @SortOrder = 'DESC'
  1457.         SET @SortBackOrder = 'ASC'
  1458.     END
  1459.     
  1460.     SET @RecordsCount = (SELECT COUNT(*) FROM DLShadowFiles)
  1461.     
  1462.     IF ISNULL(@PosFrom, 0) <= 0
  1463.         SET @PosFrom = 1
  1464.  
  1465.     IF ISNULL(@RecCount, 0) < 0
  1466.         RETURN 1
  1467.     
  1468.     IF @PosFrom > @RecordsCount BEGIN
  1469.         SET @RecCount = 0
  1470.     END
  1471.     ELSE IF @PosFrom + @RecCount > @RecordsCount BEGIN
  1472.         SET @RecCount = @RecordsCount - @PosFrom + 1        
  1473.     END
  1474.  
  1475.     
  1476.     SET @Query = 
  1477.     N'sf.ServerId AS ServerId, 
  1478.     sf.ShadowId AS ShadowId, 
  1479.     sf.Attributes AS Attributes, 
  1480.     sf.ShadowSize AS ShadowSize, 
  1481.     st.NetworkAddr AS NetworkAddr, 
  1482.     ' + @FieldName + N' AS SortField ' + @Query
  1483.     
  1484.     IF @RecCount IS NULL BEGIN
  1485.         SET @Query = N'SELECT DISTINCT ' + @Query
  1486.  
  1487.         SET @Query = N'SELECT S1.ServerId AS ServerId, S1.ShadowId AS ShadowId, S1.Attributes AS Attributes, S1.ShadowSize AS ShadowSize, S1.NetworkAddr AS NetworkAddr, sf.XMLFile AS XMLFile 
  1488.                     FROM (' + @Query + N') AS S1,
  1489.                     DLShadowFiles as sf
  1490.                     WHERE S1.ServerId = sf.ServerId 
  1491.                     AND S1.ShadowId = sf.ShadowId
  1492.                     ORDER BY S1.SortField ' + @SortOrder + N', S1.ShadowId '+@SortOrder
  1493.     END
  1494.     ELSE BEGIN
  1495.         SET @Query = N'SELECT DISTINCT TOP ' + CAST(@PosFrom+@RecCount-1 AS nvarchar(10)) + N' ' +
  1496.                     @Query + 
  1497.                     N' ORDER BY ' + @FieldName + N' ' + @SortOrder + N', sf.ShadowId ' + @SortOrder
  1498.  
  1499.         SET @Query = N'SELECT TOP '+ CAST(@RecCount AS nvarchar(10)) + N' * 
  1500.                     FROM (' + @Query + N') AS S1 
  1501.                     ORDER BY SortField ' + @SortBackOrder + N', ShadowId '+ @SortBackOrder
  1502.  
  1503.         SET @Query = N'SELECT S2.ServerId AS ServerId, S2.ShadowId AS ShadowId, S2.Attributes AS Attributes, S2.ShadowSize AS ShadowSize, S2.NetworkAddr AS NetworkAddr, sf1.XMLFile AS XMLFile 
  1504.                     FROM (' + @Query + N') AS S2, 
  1505.                     DLShadowFiles AS sf1 
  1506.                     WHERE S2.ServerId = sf1.ServerId 
  1507.                     AND S2.ShadowId = sf1.ShadowId 
  1508.                     ORDER BY S2.SortField' + N' '+ @SortOrder + N', S2.ShadowId ' + @SortOrder
  1509.     END
  1510.     
  1511. exec_query:
  1512.  
  1513.     SET NOCOUNT OFF
  1514.     EXEC(@Query)
  1515.     SET NOCOUNT ON
  1516.     IF @@ERROR <> 0
  1517.         RETURN 1
  1518.     RETURN 0        
  1519. GO
  1520.  
  1521. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLGetShadowAttr') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  1522.     DROP PROCEDURE DLGetShadowAttr
  1523. GO
  1524. CREATE PROCEDURE DLGetShadowAttr
  1525.     @ServerId int,
  1526.     @ShadowId int,
  1527.     @Attr int output
  1528. AS
  1529.     SET NOCOUNT ON
  1530.     SELECT @Attr = Attributes
  1531.         FROM DLShadowFiles
  1532.         WHERE ServerId = @ServerId
  1533.         AND ShadowId = @ShadowId
  1534.  
  1535.     IF @@ROWCOUNT = 0
  1536.         RETURN 1        
  1537.     RETURN 0
  1538. GO
  1539.  
  1540. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLSetShadowAttr') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  1541.     DROP PROCEDURE DLSetShadowAttr
  1542. GO
  1543. CREATE PROCEDURE DLSetShadowAttr
  1544.     @ServerId int,
  1545.     @ShadowId int,
  1546.     @AttrAdd int,
  1547.     @AttrDel int
  1548. AS
  1549.     SET NOCOUNT ON
  1550.     UPDATE DLShadowFiles
  1551.         SET Attributes = (Attributes & ~@AttrDel) | @AttrAdd
  1552.         WHERE ServerId = @ServerId
  1553.         AND ShadowId = @ShadowId
  1554.     IF @@ROWCOUNT = 0
  1555.         RETURN 1
  1556.     RETURN 0
  1557. GO
  1558.  
  1559. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLPreAddShadowLog') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  1560.     DROP PROCEDURE DLPreAddShadowLog
  1561. GO
  1562.  
  1563. CREATE PROCEDURE DLPreAddShadowLog
  1564.     @Size int,
  1565.     @NeedDelete int,
  1566.     @TimeBefore bigint = NULL,
  1567.     @AttrIncl int,
  1568.     @AttrExcl int,
  1569.     @AttrSetExcl int,
  1570.     @AttrSet int
  1571. AS
  1572.     SET NOCOUNT ON
  1573.     DECLARE @RecordsCount int
  1574.     DECLARE @DeleteCount int
  1575.     DECLARE @ServerId int
  1576.     DECLARE @ShadowId int
  1577.     DECLARE @Ret int
  1578.     
  1579.     SET @Ret = 0
  1580.         
  1581.     SELECT @RecordsCount = COUNT(*) 
  1582.     FROM DLShadowFiles 
  1583.     WHERE Attributes & @AttrIncl = @AttrIncl
  1584.     AND Attributes & @AttrExcl = 0
  1585.     
  1586.     IF @RecordsCount <= @Size
  1587.         RETURN 1
  1588.     
  1589.     IF @NeedDelete = 0 
  1590.         RETURN @Ret
  1591.     
  1592.     SET @DeleteCount = @RecordsCount - @Size
  1593.     
  1594.     
  1595.     IF @TimeBefore IS NULL BEGIN
  1596.         DECLARE OverwriteCur CURSOR FOR
  1597.             SELECT ServerId, ShadowId FROM DLShadowFiles 
  1598.             WHERE Attributes & @AttrIncl = @AttrIncl
  1599.             AND Attributes & (@AttrExcl | @AttrSetExcl) = 0
  1600.             ORDER BY CreationDate ASC, ShadowId ASC
  1601.     END
  1602.     ELSE BEGIN
  1603.         DECLARE OverwriteCur CURSOR FOR
  1604.             SELECT ServerId, ShadowId FROM DLShadowFiles 
  1605.             WHERE Attributes & @AttrIncl = @AttrIncl
  1606.             AND Attributes & (@AttrExcl | @AttrSetExcl) = 0 
  1607.             AND CreationDate < @TimeBefore 
  1608.             ORDER BY CreationDate ASC, ShadowId ASC        
  1609.     END
  1610.     
  1611.     OPEN OverwriteCur
  1612.     
  1613.     WHILE @DeleteCount > 0 BEGIN
  1614.          FETCH NEXT FROM OverwriteCur INTO @ServerId, @ShadowId
  1615.         IF @@fetch_status=-1 
  1616.             BREAK
  1617.         SET @DeleteCount = @DeleteCount - 1
  1618.                     
  1619.         IF @@fetch_status=-2
  1620.             CONTINUE
  1621.  
  1622.         UPDATE DLShadowFiles
  1623.             SET Attributes = @AttrSet
  1624.             WHERE ServerId = @ServerId
  1625.             AND ShadowId = @ShadowId
  1626.             
  1627.         IF @@ROWCOUNT > 0
  1628.             SET @Ret = @Ret | 2                    
  1629.     END    
  1630.     
  1631.     CLOSE OverwriteCur
  1632.     DEALLOCATE OverwriteCur
  1633.     
  1634.     IF @DeleteCount <= 0
  1635.         SET @Ret = @Ret | 1
  1636.     
  1637.     RETURN @Ret    
  1638. GO
  1639.  
  1640. IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'DLPostAddDeletedLog') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  1641.     DROP PROCEDURE DLPostAddDeletedLog
  1642. GO
  1643.  
  1644. CREATE PROCEDURE DLPostAddDeletedLog
  1645.     @Size int,
  1646.     @NeedDelete int,
  1647.     @TimeBefore bigint = NULL,
  1648.     @AttrIncl int,
  1649.     @AttrExcl int,
  1650.     @AttrSetIncl int,
  1651.     @AttrSet int
  1652. AS
  1653.     SET NOCOUNT ON
  1654.     DECLARE @RecordsCount int
  1655.     DECLARE @DeleteCount int
  1656.     DECLARE @ServerId int
  1657.     DECLARE @ShadowId int
  1658.     DECLARE @Ret int
  1659.     DECLARE @TmpRet int
  1660.     
  1661.     SET @Ret = 0
  1662.     
  1663.     IF @Size <> 0 BEGIN
  1664.         EXEC @Ret = DLPreAddShadowLog @Size, @NeedDelete, @TimeBefore, @AttrIncl, @AttrExcl, 0, @AttrSet
  1665.  
  1666.         SELECT @RecordsCount = COUNT(*) 
  1667.         FROM DLShadowFiles 
  1668.         WHERE Attributes & @AttrIncl = @AttrIncl
  1669.         AND Attributes & @AttrExcl = 0
  1670.         
  1671.         SET @DeleteCount = @RecordsCount - @Size
  1672.     END ELSE
  1673.         SET @DeleteCount = 0
  1674.         
  1675.     DECLARE OverwriteCur CURSOR FOR
  1676.         SELECT ServerId, ShadowId FROM DLShadowFiles 
  1677.         WHERE Attributes & (@AttrIncl | @AttrSetIncl) = (@AttrIncl | @AttrSetIncl)
  1678.         AND Attributes & @AttrExcl = 0
  1679.         ORDER BY CreationDate DESC
  1680.  
  1681.     OPEN OverwriteCur
  1682.     
  1683.     WHILE 1=1 BEGIN
  1684.          FETCH NEXT FROM OverwriteCur INTO @ServerId, @ShadowId
  1685.         IF @@fetch_status=-1 
  1686.             BREAK
  1687.  
  1688.         IF @@fetch_status=-2 BEGIN
  1689.             SET @DeleteCount = @DeleteCount - 1
  1690.             CONTINUE
  1691.         END
  1692.         
  1693.         IF @DeleteCount <= 0 BEGIN
  1694.             EXEC @TmpRet = DLSetShadowAttr @ServerId, @ShadowId, 0, @AttrSetIncl
  1695.             IF @TmpRet = 0
  1696.                 SET @Ret = @Ret | 2
  1697.         END
  1698.         ELSE BEGIN
  1699.             UPDATE DLShadowFiles
  1700.                 SET Attributes = @AttrSet
  1701.                 WHERE ServerId = @ServerId
  1702.                 AND ShadowId = @ShadowId
  1703.                 
  1704.             IF @@ROWCOUNT > 0
  1705.                 SET @Ret = @Ret | 6
  1706.                 
  1707.             SET @DeleteCount = @DeleteCount - 1
  1708.         END
  1709.         
  1710.     END    
  1711.     
  1712.     CLOSE OverwriteCur
  1713.     DEALLOCATE OverwriteCur
  1714.  
  1715.     IF @DeleteCount <= 0
  1716.         SET @Ret = @Ret | 1
  1717.     
  1718.     RETURN @Ret    
  1719. GO
  1720.  
  1721.